{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第二步：调整树的参数：max_depth & min_child_weight\n",
    "(在粗调最佳参数周围，将步长降为1，进行精细调整)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>Month</th>\n",
       "      <th>Day</th>\n",
       "      <th>...</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "      <th>interest_level</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.5</td>\n",
       "      <td>3</td>\n",
       "      <td>3000</td>\n",
       "      <td>1200.0</td>\n",
       "      <td>750.000000</td>\n",
       "      <td>-1.5</td>\n",
       "      <td>4.5</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>24</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>5465</td>\n",
       "      <td>2732.5</td>\n",
       "      <td>1821.666667</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>12</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>2850</td>\n",
       "      <td>1425.0</td>\n",
       "      <td>1425.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>17</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>3275</td>\n",
       "      <td>1637.5</td>\n",
       "      <td>1637.500000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>18</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>3350</td>\n",
       "      <td>1675.0</td>\n",
       "      <td>670.000000</td>\n",
       "      <td>-3.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>28</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 228 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   bathrooms  bedrooms  price  price_bathrooms  price_bedrooms  room_diff  \\\n",
       "0        1.5         3   3000           1200.0      750.000000       -1.5   \n",
       "1        1.0         2   5465           2732.5     1821.666667       -1.0   \n",
       "2        1.0         1   2850           1425.0     1425.000000        0.0   \n",
       "3        1.0         1   3275           1637.5     1637.500000        0.0   \n",
       "4        1.0         4   3350           1675.0      670.000000       -3.0   \n",
       "\n",
       "   room_num  Year  Month  Day       ...        walk  walls  war  washer  \\\n",
       "0       4.5  2016      6   24       ...           0      0    0       0   \n",
       "1       3.0  2016      6   12       ...           0      0    0       0   \n",
       "2       2.0  2016      4   17       ...           0      0    0       0   \n",
       "3       2.0  2016      4   18       ...           0      0    0       0   \n",
       "4       5.0  2016      4   28       ...           0      0    1       0   \n",
       "\n",
       "   water  wheelchair  wifi  windows  work  interest_level  \n",
       "0      0           0     0        0     0               1  \n",
       "1      0           0     0        0     0               2  \n",
       "2      0           0     0        0     0               0  \n",
       "3      0           0     0        0     0               2  \n",
       "4      0           0     0        0     0               2  \n",
       "\n",
       "[5 rows x 228 columns]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# path to where the data lies\n",
    "dpath = './data/'\n",
    "train = pd.read_csv(dpath +\"RentListingInquries_FE_train.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 将数据分割训练数据与测试数据\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "# 获取特征，标签\n",
    "y = train['interest_level']\n",
    "X = train.drop(['interest_level'], axis=1)\n",
    "\n",
    "# 由于数据集较大，在此随机采样30%的数据构建训练样本，其余作为测试样本\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33, test_size=0.7, stratify=y)\n",
    "X_train = np.array(X_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((14805, 227), (34547, 227))"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train.shape, X_test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# prepare cross validation\n",
    "# 各类样本不均衡，交叉验证是采用StratifiedKFold，在每折采样时各类样本按比例采样\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第一轮参数调整得到的n_estimators最优值（125），第一次粗粒度调优得到最佳：max_depth=5，min_child_weight=5，此次进行细粒度调优"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'max_depth': [4, 5, 6], 'min_child_weight': [4, 5, 6]}"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#max_depth 建议3-10， min_child_weight=1／sqrt(ratio_rare_event) =5.5\n",
    "max_depth = [4,5,6]\n",
    "min_child_weight = [4,5,6]\n",
    "param_test2_2 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "param_test2_2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/model_selection/_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.61806, std: 0.00282, params: {'max_depth': 4, 'min_child_weight': 4},\n",
       "  mean: -0.61769, std: 0.00363, params: {'max_depth': 4, 'min_child_weight': 5},\n",
       "  mean: -0.61915, std: 0.00438, params: {'max_depth': 4, 'min_child_weight': 6},\n",
       "  mean: -0.61556, std: 0.00505, params: {'max_depth': 5, 'min_child_weight': 4},\n",
       "  mean: -0.61608, std: 0.00461, params: {'max_depth': 5, 'min_child_weight': 5},\n",
       "  mean: -0.61670, std: 0.00422, params: {'max_depth': 5, 'min_child_weight': 6},\n",
       "  mean: -0.61873, std: 0.00481, params: {'max_depth': 6, 'min_child_weight': 4},\n",
       "  mean: -0.61809, std: 0.00462, params: {'max_depth': 6, 'min_child_weight': 5},\n",
       "  mean: -0.61820, std: 0.00562, params: {'max_depth': 6, 'min_child_weight': 6}],\n",
       " {'max_depth': 5, 'min_child_weight': 4},\n",
       " -0.61555823146554933)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb2_2 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=125,  #第一轮参数调整得到的n_estimators最优值\n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch2_2 = GridSearchCV(xgb2_2, param_grid = param_test2_2, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch2_2.fit(X_train , y_train)\n",
    "\n",
    "gsearch2_2.grid_scores_, gsearch2_2.best_params_,     gsearch2_2.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([ 22.35373459,  24.18261862,  23.01954803,  24.69401274,\n",
       "         23.89593844,  23.69727812,  27.80648284,  27.56993461,  25.96101556]),\n",
       " 'mean_score_time': array([ 0.10653501,  0.11997008,  0.09658036,  0.10694785,  0.10434833,\n",
       "         0.10840478,  0.12251759,  0.12109361,  0.10991688]),\n",
       " 'mean_test_score': array([-0.61805599, -0.61768659, -0.61915346, -0.61555823, -0.61608457,\n",
       "        -0.61670152, -0.61872912, -0.61808846, -0.61820094]),\n",
       " 'mean_train_score': array([-0.5469198 , -0.54821638, -0.54989703, -0.50445566, -0.50815157,\n",
       "        -0.51148071, -0.4577326 , -0.46423361, -0.47054942]),\n",
       " 'param_max_depth': masked_array(data = [4 4 4 5 5 5 6 6 6],\n",
       "              mask = [False False False False False False False False False],\n",
       "        fill_value = ?),\n",
       " 'param_min_child_weight': masked_array(data = [4 5 6 4 5 6 4 5 6],\n",
       "              mask = [False False False False False False False False False],\n",
       "        fill_value = ?),\n",
       " 'params': [{'max_depth': 4, 'min_child_weight': 4},\n",
       "  {'max_depth': 4, 'min_child_weight': 5},\n",
       "  {'max_depth': 4, 'min_child_weight': 6},\n",
       "  {'max_depth': 5, 'min_child_weight': 4},\n",
       "  {'max_depth': 5, 'min_child_weight': 5},\n",
       "  {'max_depth': 5, 'min_child_weight': 6},\n",
       "  {'max_depth': 6, 'min_child_weight': 4},\n",
       "  {'max_depth': 6, 'min_child_weight': 5},\n",
       "  {'max_depth': 6, 'min_child_weight': 6}],\n",
       " 'rank_test_score': array([5, 4, 9, 1, 2, 3, 8, 6, 7], dtype=int32),\n",
       " 'split0_test_score': array([-0.6170329 , -0.61481694, -0.61730433, -0.61030726, -0.61198664,\n",
       "        -0.61353326, -0.6129772 , -0.61168531, -0.61627922]),\n",
       " 'split0_train_score': array([-0.54830064, -0.54934691, -0.5520839 , -0.50824159, -0.51086703,\n",
       "        -0.5144616 , -0.46165747, -0.46875167, -0.47289979]),\n",
       " 'split1_test_score': array([-0.62340225, -0.62475797, -0.62735184, -0.62511375, -0.62380611,\n",
       "        -0.62336293, -0.62730069, -0.62569319, -0.62845566]),\n",
       " 'split1_train_score': array([-0.54570297, -0.54740107, -0.54926242, -0.50225223, -0.50441365,\n",
       "        -0.50780983, -0.4546843 , -0.46005146, -0.46744577]),\n",
       " 'split2_test_score': array([-0.61695697, -0.61711512, -0.61710158, -0.61530389, -0.61855225,\n",
       "        -0.61767837, -0.61862387, -0.61628095, -0.61724754]),\n",
       " 'split2_train_score': array([-0.54647011, -0.5470021 , -0.55017174, -0.50440032, -0.5098186 ,\n",
       "        -0.51217859, -0.4571993 , -0.46304807, -0.47001648]),\n",
       " 'split3_test_score': array([-0.61507384, -0.61530121, -0.61459109, -0.61316587, -0.61144841,\n",
       "        -0.61102333, -0.61569488, -0.61689909, -0.61128147]),\n",
       " 'split3_train_score': array([-0.54654597, -0.54818477, -0.54925201, -0.50287463, -0.50680332,\n",
       "        -0.51036194, -0.4570482 , -0.46516238, -0.47046925]),\n",
       " 'split4_test_score': array([-0.61781143, -0.61643906, -0.61941485, -0.61389756, -0.61462615,\n",
       "        -0.61790701, -0.61904706, -0.61988356, -0.61773553]),\n",
       " 'split4_train_score': array([-0.5475793 , -0.54914706, -0.54871506, -0.50450955, -0.50885523,\n",
       "        -0.5125916 , -0.45807374, -0.46415448, -0.47191579]),\n",
       " 'std_fit_time': array([ 1.28612592,  0.53114548,  0.42974319,  1.16285259,  0.10851406,\n",
       "         0.03521074,  0.08648579,  0.12931235,  3.20814225]),\n",
       " 'std_score_time': array([ 0.01642172,  0.03611736,  0.00376392,  0.00160008,  0.0029005 ,\n",
       "         0.00428359,  0.0069248 ,  0.00895374,  0.01551563]),\n",
       " 'std_test_score': array([ 0.00282124,  0.00362848,  0.00437592,  0.00504904,  0.00460746,\n",
       "         0.00422063,  0.00481473,  0.004621  ,  0.0056192 ]),\n",
       " 'std_train_score': array([ 0.00091261,  0.00092569,  0.00118943,  0.00208298,  0.00229946,\n",
       "         0.00225095,  0.00226123,  0.0028347 ,  0.00186088])}"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gsearch2_2.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: -0.615558 using {'max_depth': 5, 'min_child_weight': 4}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaEAAAELCAYAAABwLzlKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzs3Xd81fW9+PHXO3sxshkh7DCEkEBE\nUUFEltU6WrV1XbSltFqv1V4Hrf113FvvRaSuWts6SrW2Vmu1WrXKEASpikBYIiMgI6yEQBgJIev9\n++P7PclJONknORnv5+PxfSTn+/18v+dzYuSd92eKqmKMMcYEQlCgK2CMMabrsiBkjDEmYCwIGWOM\nCRgLQsYYYwLGgpAxxpiAsSBkjDEmYCwIGWOMCRgLQsYYYwLGgpAxxpiACQl0Bdq7hIQEHTBgQKCr\nYYwxHcbatWuPqGpiY8paEGrAgAEDWLNmTaCrYYwxHYaI7GlsWWuOM8YYEzABCUIiEicii0Vkh/s1\nto5yqSKySES+EJEtIjLAPX+niOSIiIpIglf5ySJyXETWu8dPva7tFpFN7nlLbYwxph0IVCY0F1iq\nqkOBpe5rX14EHlHVEcB4IM89vwqYCvhK+VaqaoZ7/Heta5e457Na/hGMMca0VKD6hK4CJrvfvwAs\nBx7wLiAiI4EQVV0MoKqnPNdUNdst0wZVNaZjKSsrIzc3l5KSkkBXxXRyERERpKSkEBoa2uxnBCoI\nJavqQQBVPSgiST7KpAGFIvI6MBBYAsxV1YoGnj1BRDYAB4B7VfVz97wCi0REgd+r6jN++STGtDO5\nubl069aNAQMG2B9qptWoKgUFBeTm5jJw4MBmP6fVgpCILAF6+bj0YCMfEQJMBDKBvcArwK3A8/Xc\nsw7or6qnROQrwD+Aoe61C1X1gBvwFovIVlVdUUfd5wBzAFJTUxtZXWPah5KSEgtAptWJCPHx8eTn\n57foOa3WJ6SqU1V1lI/jTeCwiPQGcL/m+XhELpCtqrtUtRwnoIxt4D1PeJrtVPVdINQzcEFVD7hf\n84A3cPqY6nrOM6qapapZiYmNGupuTLtiAci0BX/8ngVqYMJbwCz3+1nAmz7KfAbEiognCkwBttT3\nUBHpJe5PRUTG43y+AhGJFpFu7vloYDqwucWfoj5r/gDb34cTB8C2UDfGGJ8C1Sc0D3hVRL6N09R2\nHYCIZAHfU9XZqlohIvcCS93AshZ41i13F3A/TnPfRhF5V1VnA9cCt4tIOXAa+KaqqogkA2+48SkE\n+Iuqvtdqn66iDP71AFSUOq+jEqB3OvRKh16jofcYiBsMQTZNyxjTtQXkX0FVLVDVS1V1qPv1qHt+\njRtMPOUWq2q6qo5W1VtVtdQ9/6SqpqhqiKr28dyjqk+p6jmqOkZVz1fVf7vnd7nnxrjXH2rVDxgc\nCvfvgtveg8vmw7CZUHQEPv4N/P3b8FQW/F8KPDcN3vkvWPsC7F8HZTaayXR8hYWFPP3008269/HH\nH6e4uLjFdVizZg133XVXi5/jceutt/Laa6+ddf7AgQNce+21ACxfvpwrrrjC5/0DBgzgyJEjfquP\nx+zZs9mypd4Gojrrvnv3bv7yl7/Ue29FRQWZmZl1fi5/sGV7Wkt4N+g/wTk8ykvhyDY4uBEObYRD\nm2Djq/DZc851CYbE4W625MmcRkGkz7m8xrRLniB0xx13NPnexx9/nJtvvpmoqKgW1SErK4usrNaf\nDtinTx+f/8C3leeee67Z93qC0I033lhnmSeeeIIRI0Zw4sSJZr9PQywItaWQMCfA9BoN3OScq6yE\nwt1uYNrkBKddy2HjX6vv65nqBqT06uDUvQ9Y57NpwC/++TlbDvj3H5CRfbrzs6+eU+f1uXPnsnPn\nTjIyMpg2bRpJSUm8+uqrnDlzhmuuuYZf/OIXFBUVcf3115Obm0tFRQX/7//9Pw4fPsyBAwe45JJL\nSEhIYNmyZT6fHxMTw/e//32WLFlCbGws//u//8v999/P3r17efzxx7nyyitZvnw5CxYs4O233+bn\nP/85e/fuZdeuXezdu5e777673izpxRdfZMGCBYgI6enp/OlPfwJgxYoVPProoxw6dIj58+dz7bXX\nsnv3bq644go2b67ZxVxQUMANN9xAfn4+48ePR+vpF54/fz4RERHcdddd3HPPPWzYsIEPPviApUuX\nsnDhQl566SUWLVrEz372M86cOcPgwYNZuHAhMTExTJ48mQULFpCVlcXzzz/Pww8/TJ8+fRg6dCjh\n4eE89dRTddZ97ty5fPHFF2RkZDBr1izuueeeGvXKzc3lnXfe4cEHH+TRRx+ts/4tZUEo0IKCIG6Q\nc5xzdfX5U3lOQPIOTlvfwZnuBETFuwEt3elj6jUa4odAUHBAPoYxHvPmzWPz5s2sX7+eRYsW8dpr\nr7F69WpUlSuvvJIVK1aQn59Pnz59eOeddwA4fvw4PXr04NFHH2XZsmUkJCTU+fyioiImT57Mww8/\nzDXXXMNPfvITFi9ezJYtW5g1axZXXnnlWfds3bqVZcuWcfLkSYYNG8btt9/uc4Ll559/zkMPPcSq\nVatISEjg6NGjVdcOHjzIRx99xNatW7nyyiurmuF8+cUvfsFFF13ET3/6U9555x2eeabuaYmTJk3i\nV7/6FXfddRdr1qzhzJkzlJWV8dFHHzFx4kSOHDnCL3/5S5YsWUJ0dDQPP/wwjz76KD/9adWqZBw4\ncID/+Z//Yd26dXTr1o0pU6YwZsyYeus+b968qkDtecbs2bN59913Abj77ruZP38+J0+erLPu/mBB\nqL2KSYIhU53D48wpOPy5G5w2OMHp099VD4AIjYLkc7yCUzokjYTQyMB8BhNw9WUsbWHRokUsWrSI\nzMxMAE6dOsWOHTuYOHEi9957Lw888ABXXHEFEydObPQzw8LCmDlzJgCjR48mPDyc0NBQRo8eze7d\nu33ec/nllxMeHk54eDhJSUkcPnyYlJSUs8p98MEHXHvttVVBMC4urura1VdfTVBQECNHjuTw4cP1\n1nHFihW8/vrrVe8dG1t3k/q4ceNYu3YtJ0+eJDw8nLFjx7JmzRpWrlzJk08+ySeffMKWLVu48MIL\nASgtLWXChAk1nrF69Wouvvjiqvped911bN++vUl179OnT1UAevvtt0lKSmLcuHEsX7683s/aUhaE\nOpLwGEg9zzk8Ksogf1t1tnRwI2z6uzNEHJx+poQ0txlvdPUIvag43+9hjB+pKj/60Y/47ne/e9a1\ntWvX8u677/KjH/2I6dOn1/jLvj6hoaFV81OCgoIIDw+v+r68vNznPZ4yAMHBwXWWU9U65754P6O+\n5jWPxs6hCQ0NZcCAASxcuJALLriA9PR0li1bxs6dOxkxYgQ7d+5k2rRpvPzyy3U+o6H6NLXuq1at\n4q233uLdd9+lpKSEEydOcPPNN/PSSy816jM1hY0R7uiCQ53BCxk3wMz/g9vegbl74Acb4Po/wcQf\nQmx/+HIlLPoJvHglzB8Ij42Cl2+E5fOcZr7CfTafyfhFt27dqppwZsyYwR/+8AdOnXKWfty/fz95\neXkcOHCAqKgobr75Zu69917WrVt31r2BcOmll/Lqq69SUFAAUKM5rikmTZrEn//8ZwD+9a9/cezY\nsQbLL1iwgEmTJjFx4kR+97vfkZGRgYhw/vnns2rVKnJycgAoLi6ukeUAjB8/ng8//JBjx45RXl7O\n3//+9wbrWN/P+v/+7//Izc1l9+7d/PWvf2XKlCmtEoDAMqHOSQRiBzjHSK/28aIjXv1Mbl/Ttnep\n6meKjK3Vz5Tu9DMF26+Jabz4+HguvPBCRo0axWWXXcaNN95Y1XwUExPDSy+9RE5ODvfddx9BQUGE\nhoby29/+FoA5c+Zw2WWX0bt37zoHJrSmc845hwcffJCLL76Y4OBgMjMz+eMf/9jk5/zsZz/jhhtu\nYOzYsVx88cUNLv81ceJEHnroISZMmEB0dDQRERFVTZSJiYn88Y9/5IYbbuDMmTMA/PKXvyQtLa3q\n/r59+/LjH/+Y8847jz59+jBy5Eh69OhR73ump6cTEhLCmDFjuPXWW/nGN75Ro0+orUhjUrOuLCsr\nSzv1zqqlRV79TG5wOrwFKpxfdkIi3H4mr4m2SSMhrGVDaE3r+eKLLxgxYkSgq2Ha2KlTp4iJiaG8\nvJxrrrmGb33rW1xzzTWt/r6+ft9EZG1jt8yxP3G7urBo6DfeOTwqyuHI9ups6eAG+Px1WLvQuS5B\nED/07FUgrJ/JmID5+c9/zpIlSygpKWH69OlcffXVDd/UDlgQMmcLDoHkkc4x5pvOOVU4vq9mU96e\nj2HT36rv655Sc6Jt73To0c/mM5lmOe+886qanzz+9Kc/MXr06BY/u6CggEsvvfSs80uXLiU+Pr7F\nzw/Eey5YsKDFzwgEC0KmcUScSbM9U2GE1xIeRQXVQcnTpLfjfdBK53pEz+pMydPflJBm/UymQZ9+\n+mmrPTs+Pp7169e32vPby3t2BPYvgWmZ6HgYfIlzeJQWQ96W6rlMhzY6SxOVu2vjBYc7WZb3ChDJ\n5zhNg8aYLsWCkPG/sChIyXIOj4pyKMjxmmi7Eba8CetecAsIJAytOdG2VzpE1z1z3hjT8VkQMm0j\nOASShjtH+vXOOVU4nus1AGIj7FsNm73mOHTrU3Oibe906Nnf+pmM6SQsCJnAEYGe/Zxj+OXV54uP\nVjfjeYLTjsWgFc718B61VhofDYnDnIm7xpgOxVZMMO1PVBwMuhgu+E/42jPw/U/gx/vhOx/AFY/D\n6K8785jWLIR/fA9+dyH8b1/4/cXw5p2w+lnY+6mz1p5pc7af0Nk64n5CAwYMYPTo0WRkZLTqthiW\nCZmOITQS+o5zDo/KCrefaVN1P9PWdyD7T24BgfjBXnOZ0qHXGIhJ9PkWxj9sP6G209r7CTW0ork/\nWBAyHVdQsNMMlzgMRrvL6qvCiQM1V4DYv8aZbOsR06vWRNt0iB3YOfuZ/jXXCdL+1Gs0XDavzsu2\nn1Dn2E+orVgQMp2LCPTo6xzDLqs+f/oYHNpcc4+mnKVe/UzdIXlUzYm2CcOcjQhNk9h+Qp1jPyER\nYfr06YgI3/3ud5kzZ06dn6ElAhKERCQOeAUYAOwGrlfVs5aZFZFU4DmgH84qm19R1d0icidwNzAY\nSFTVI173TAYeB0KBI6p6sXt+JvAEEAw8p6p1/ylnOp/IWBg40Tk8ykqc+UzeE23XvQhlbp9EcJiz\n3XpV1uRutx7eLTCfoTnqyVjagu0n1DH3EwJnO4c+ffqQl5fHtGnTGD58OJMmTar3czdHoDKhucBS\nVZ0nInPd1w/4KPci8JCqLhaRGMCdhs8q4G1guXdhEekJPA3MVNW9IpLkng8GfgNMA3KBz0TkLVWt\nv0fPdG6hEdB3rHN4VFbA0V01J9puew+yvZaxjxtUcy5Tr3Toltz29e8AbD+hhrXH/YTACUoASUlJ\nXHPNNaxevbpVglCgRsddBXhmKb4AnLXSnoiMBEJUdTGAqp5S1WL3+2xV3e3juTcCr6vqXrdcnnt+\nPJCjqrtUtRT4q1sHY2oKCnYmzY6+Fqb9Am55A+7LgR9uhRtfhUt+4qzucHA9LP1v+PO18Ks0WJAG\nL30dlvwCPn8DCnZCZWXD79cJ2X5CHX8/oaKioqprRUVFLFq0iFGjRjX4zOYIVCaUrKoHAVT1oCdj\nqSUNKBSR14GBwBJgrqqnEd+nNCBURJYD3YAnVPVFoC+wz6tcLnDe2bcb44MIdO/tHGkzqs+XHHez\npU3VgyB2LYdK96/ssG5O8533RNvEEZ2+n8n2E+r4+wkdPny4ahuI8vJybrzxxqomUH9rtf2ERGQJ\n0MvHpQeBF1S1p1fZY6pao9FURK4Fngcygb04fUjvqurzXmV2A1mePiEReQrIAi4FIoGPgcuBMcAM\nVZ3tlrsFGK+q/1lH3ecAcwBSU1PH7dmzp8mf33RR5Wcg74uaE20Pb4ZSd85SUGitfqbRzhHR3W9V\nsP2EuibbT6gWVZ1a1zUROSwivd0sqDeQ56NYLpCtqrvce/4BnI8TmOqSizMYoQgoEpEVOAEoF2dw\ng0cKcKCeuj8DPAPOpnb1vJ8xNYWEQ58M5/CorHT6mQ5t9FppfBGs/3N1mdiBNecy9RoN3Xp1zmHj\nplXYfkJN8xYwC5jnfn3TR5nPgFgRSVTVfGAK0NAWp28CT4lICBCG0+T2GLAVGCoiA4H9wDdx+o+M\naX1BQZAwxDlGfa36/MlDXvszucHpi7eqr0cnnj3RNm6Q87wuwPYTahrbT6hp5gGvisi3cZrargMQ\nkSzge6o6W1UrROReYKk4w0zWAs+65e4C7sdp7tsoIu+693whIu8BG3FG0j2nqpvde+4E3scZov0H\nVf28LT+wMWfp1ss50qZXnys54TTfeeYyHdoAH/8GKsuc66HRbj9TOvTJdHbEjR/SKTMm20+oa2i1\nPqHOIisrS9esaSgBM6YVlZdC/taaE20PbYJSd2RTZCyknAsp46HfuXxRksiIkecEts6my2i3fULG\nGD8JCXOa43qnO8N0wOlnOrIdclc721/kfub0MwHM+BvkBTv7OoVFO9lTSHinzJZMx2dByJiOKCio\nen+msf/hnDtd6KyTdzLG2b/pdCEUO/NdkGAnIHmO0ChnTpQxAdY1ejiN6Qoie8KQqRDRw+kn6jXa\nGQ7eox9E9oCKUjh5sHqH27ytULjP2b+pvMRZ/NUPbCuHs3XErRwKCwu59tprGT58OCNGjODjjz9u\ncX19sSBkTGcl4myBEZ3g7EabNMIJTHGDnZXEg0Lg9FEo3OPMbTq82Vnp4eQhOHPSWcKoGdpDEMrK\nyuLJJ59s8XMa0h62chg5cmSz7m0oCP3gBz9g5syZbN26lQ0bNrTa3DMLQsZ0JUEhzsTY7r2dIeO9\n0quzpfDuzmTbOrOlM43Klry3crjvvvt45JFHOPfcc0lPT+dnP/sZ4CwFc/nllzNmzBhGjRrFK6+8\nwpNPPlm1lcMll1xS5/NjYmJ44IEHGDduHFOnTmX16tVMnjyZQYMG8dZbzhB376zk5z//Od/61req\nyjQUnF588UXS09MZM2YMt9xyS9X5FStWcMEFFzBo0KCqwLN7926fy9kUFBQwffp0MjMz+e53v9vg\nVg6eOt1zzz1MmTIFcIZu33zzzYCzEOyECRMYO3Ys1113XdUySJMnT8YzcOr5558nLS2NyZMn853v\nfIc777yz3rrPnTuXlStXkpGRwWOPPVajTidOnGDFihV8+9vfBpxFY3v27ElrsD4hYzqxh1c/zNaj\nW5t2k6qzxYVWOtlQjZWyhOE9h/BA5l119i3ZVg4dfyuHXbt2kZiYyG233caGDRsYN24cTzzxBNHR\n0XV+juayTMgYU5OIkzEFhznNeWExTrAJDncCTmW5V7a0yRk+ftx3tuS9lcPYsWPZunUrO3bsYPTo\n0SxZsoQHHniAlStXNrjOmbfaWzlcfPHFjd7KISEhoWorB1/8uZWDJ4tp6lYOEyZMqNrKYeLEiTW2\ncsjIyOCFF16g9lJi3ls5hIaGct1119W43tStHMrLy1m3bh2333472dnZREdHM29e62wLYpmQMZ3Y\nA+N97ZDiBxXlUFYEpe5RfBQ823odOewOgjiMlp/hRw88wHdvv/2sR9hWDo72uJVDSkoKKSkpnHee\ns86zJ3NqDZYJGWOaLjjEGYXXvY+z9UUvdyfaHil0i+vFyZOn4OQBZpw3gj88+zSnvlwHx3PZn7OZ\nvAP7OLB/v23lUKt8e9rKoVevXvTr149t27YBTv9UcwdANMQyIWNMy4m4k2OjiB+cyIWTJjNq+s1c\nNu1SbvzGdUy4/AbQSmKiInnp178kZ88B7vvl4wQFhxAaFs5vn7atHNrTVg4Av/71r7npppsoLS1l\n0KBBLFy4sMk/h8awZXsaYMv2mI6m3W7loAplp2s241WUuhfd4eRVk2mjITjUVnloAtvKwRhj6uOV\nLRGd6JyrKHOCUVkRlBZDUQEU5TvXgkJrLj0UGtVlVhBvDtvKwRhjmio41FnpIdKdg6KVUFYCpUWc\nd/E0zpypuZLDn55+hNEZY73WxGveLrW2lUP7YUHIGNN+SFBVtvTpWnfbgxrZUhEUHamVLXmviRfp\nPKMBtpVD+2FByJhOqL6hxh2Oz2zptNuvVOwEp5JCt7A4zXZh0dVNecHNy5ZMw/wxpsCCkDGdTERE\nBAUFBcTHx3eeQORNgqozHw9PtuQ5ivKhyP0HspnZkqmfqlJQUEBERESLnmNByJhOJiUlhdzcXPLz\n8wNdlcDRMCcwVZyB8lNQcdhZ6QEAcfqSgsOrv9q2Fs0SERFBSkpKi55hQciYTiY0NJSBAwcGuhrt\nz4kD1RsA7lsNB9dXDxHvkQr9qnenJXl0swc9mKYJSBASkTjgFWAAsBu4XlXPmlIsIqnAc0A/QIGv\nqOpuEbkTuBsYDCSq6hGveyYDjwOhwBFVvdg9vxs4CVQA5Y0dw26M6SS694FzrnYOcNa5O7ixenfa\nvZ/AZnelgZAI6JPpbJveb7wTnLolB67unVhAJquKyHzgqKrOE5G5QKyqnrXIlYgsBx5S1cUiEgNU\nqmqxiGQCx4DlQJYnCIlIT+DfwExV3SsiSaqa517b7V22sWyyqjFdyPH9blD6zPl6cEN1ttQz1c2U\nxjvBqddoZ9CEOUtHmKx6FTDZ/f4FnGBSIwiJyEggRFUXA6jqKc81Vc12y9R+7o3A66q61y2X5/+q\nG2M6rR59occ1cI670kBZibOv0r7VTlDaswo2u5vYhUQ62VK/c6HfeU6AikkMXN07qEAFoWRVPQig\nqgdFJMlHmTSgUEReBwYCS4C5qlrfdo9pQKibQXUDnlDVF91rCiwSEQV+r6p1b/BhjDEAoRFO5tNv\nvPNaFY7n1syWPn4aVj3hXI8dUDNbSh7lLPZq6tRqPx0RWQL08nHpwUY+IgSYCGQCe3H6kG4Fnm/g\nnnHApUAk8LGIfKKq24ELVfWAG/AWi8hWVV1RR93nAHOABhceNMZ0ISLQs59zjPq6c66sxBnk4MmW\nvlwBm151roVGQZ+xXoMexjvbrZsqrRaEVHVqXddE5LCI9HazoN6Ar2azXCBbVXe59/wDOJ/6g1Au\nzmCEIqBIRFYAY4DtqnrArVeeiLwBjAd8BiE3S3oGnD6hBj6qMaYrC42A1POdA9xsaV/NkXj//nX1\nEPHYgdWZUr/xkHROl86WAvXJ3wJmAfPcr2/6KPMZECsiiaqaD0wBGhoh8CbwlIiEAGHAecBjIhIN\nBKnqSff76cB/++ejGGOMFxFnEEPPVBjtbgFedhoOrK8eibdzGWx8xbkWGg19x1aPwks5F6JbZ/26\n9ihQQWge8KqIfBunqe06ABHJAr6nqrNVtUJE7gWWijMCYS3wrFvuLuB+nOa+jSLyrnvPFyLyHrAR\nqASeU9XNIjIIeMMdyBAC/EVV32vTT2yM6bpCI6H/BOcAJ1sq3FPdr7RvNXz0OHi6vOMG18qWRnba\nCbW2n1ADbIi2MaZNlBbDgeyagx48C7WGxTjZkvegh6i4wNa3Hh1hiLYxxhhvYVEw4ELnACdbOra7\nul8pdzV89Fh1thQ/pHqFh5TxkDSiQ2ZLFoSMMaY9EoG4gc6Rfr1zrrQI9q+rzpZ2vA8b/uJcC+sG\nKeO8sqUsiIwNXP0byYKQMcZ0FGHRMHCic4CTLR3dVTNbWrnA2e4CICGtZraUOLzd7U5rQcgYYzoq\nEYgf7BxjvumcO3MKDqyrHiK+7V1Y/5JzLbw79B3nNRIvq3qfpgCxIGSMMZ1JeAwMnOQcUJ0teTKl\nfathxSNe2dIwr8m05znZUxtmSxaEjDGmM/POljJucM6dOQn711aPwtv6DmS72VJED+ib5QSkSfe1\nekCyIGSMMV1NeDcYNNk5wMmWCnK8sqXPnKWHJp+1uYHfWRAyxpiuTgQShjpH5k3OufLSNnnr9jVM\nwhhjTPvQRjvLWhAyxhgTMBaEjDHGBIwFIWOMMQFjQcgYY0zAWBAyxhgTMBaEjDHGBIwFIWOMMQFj\nQcgYY0zAWBAyxhgTME0KQiISKyLprVUZY4wxXUuDQUhElotIdxGJAzYAC0Xk0Za8qYjEichiEdnh\nfvW5/Z+IpIrIIhH5QkS2iMgA9/ydIpIjIioiCV7l7xOR9e6xWUQq3HojIjNFZJt739yW1N8YY4x/\nNCYT6qGqJ4CvAQtVdRwwtYXvOxdYqqpDgaXua19eBB5R1RHAeCDPPb/KrcMe78Kq+oiqZqhqBvAj\n4ENVPSoiwcBvgMuAkcANIjKyhZ/BGGNMCzUmCIWISG/geuBtP73vVcAL7vcvAFfXLuAGiRBVXQyg\nqqdUtdj9PltVdzfwHjcAL7vfjwdyVHWXqpYCf3XrYIwxJoAaE4T+G3gf5x/xz0RkELCjhe+brKoH\nAdyvST7KpAGFIvK6iGSLyCNuRtMgEYkCZgJ/d0/1BfZ5Fcl1zxljjAmgBvcTUtW/AX/zer0L+HpD\n94nIEqCXj0sPNqFuE4FMYC/wCnAr8Hwj7v0qsEpVj3qq46OM1nWziMwB5gCkpqY2srrGGGOaqjED\nE+a7AxNCRWSpiBwRkZsbuk9Vp6rqKB/Hm8Bht4kP92uej0fkAtluE1o58A9gbCM/1zepborzPKuf\n1+sU4EA9dX9GVbNUNSsxMbGRb2mMMaapGtMcN90dmHAFzj/macB9LXzft4BZ7vezgDd9lPkMiBUR\nTxSYAmxp6MEi0gO4uNYzPwOGishAEQnDCVJvNbPuxhhj/KQxQSjU/foV4GWvJq6WmAdME5EdwDT3\nNSKSJSLPAahqBXAvsFRENuE0qT3rlrtLRHJxMpqNnntc1wCLVLXIc8LNpO7E6dv6AnhVVT/3w+cw\nxhjTAqJaZ9eIU0BkHs7otdM4o8x6Am+r6nmtX73Ay8rK0jVr1gS6GsYY02GIyFpVzWpM2QYzIVWd\nC0wAslS1DCjChjcbY4zxgwZHx4lIKHALMElEAD4EftfK9TLGGNMFNBiEgN/i9As97b6+xT03u7Uq\nZYwxpmtoTBA6V1XHeL3+QEQ2tFaFjDHGdB2NGR1XISKDPS/cFRMqWq9KxhhjuorGZEL3ActEZBfO\nMOn+wG2tWitjjDFdQmOW7VmUiCNeAAAgAElEQVQqIkOBYThBaCuQ0doVM8YY0/k1JhNCVc8AGz2v\nReRvgC2qZowxpkWau723rwVBjTHGmCZpbhCqf5kFY4wxphHqbI4TkX/iO9gIEN9qNTLGGNNl1Ncn\ntKCZ14wxxphGqTMIqeqHbVkRY4wxXU9z+4SMMcaYFrMgZIwxJmAsCBljjAmYxmzl4GuU3HFgDfB7\nVS1pjYoZY4zp/BqTCe0CTuFsrf0scAI4DKS5r40xxphmacyyPZmqOsnr9T9FZIWqThKRz5vzpiIS\nB7wCDAB2A9er6jEf5VKB54B+ONnYV1R1t4jcCdwNDAYSVfWIW/4+4CavzzbCvX5URHYDJ3FWAC9v\n7NazxhhjWk9jMqFENxgAVYEhwX1Z2sz3nQssVdWhwFL3tS8vAo+o6ghgPJDnnl8FTAX2eBdW1UdU\nNUNVM4AfAR+q6lGvIpe41y0AGWNMO9CYTOi/gI9EZCfOagkDgTtEJBp4oZnvexUw2f3+BWA58IB3\nAREZCYSo6mIAVT3luaaq2W6Z+t7jBuDlZtbPGGNMG2jMVg7vuls5DMfdysFrMMLjzXzfZFU96D7/\noIgk+SiTBhSKyOs4gW8JMFdVG9xQT0SigJnAnd4fBVgkIoozoOKZZtbdGGOMnzRmdFwo8F3A0y+0\nXER+r6plDdy3BOjl49KDTajbRCAT2IvTh3Qr8Hwj7v0qsKpWU9yFqnrADXiLRWSrqq6oo+5zgDkA\nqam2Y4UxxrSWxjTH/RYIBZ52X9/inptd302qOrWuayJyWER6u1lQb6r7erzlAtmqusu95x/A+TQu\nCH2TWk1xqnrA/ZonIm/g9DH5DEJulvQMQFZWlq0YbowxraQxAxPOVdVZqvqBe9wGnNvC930LmOV+\nPwt400eZz4BYEUl0X08BtjT0YBHpAVzs/UwRiRaRbp7vgenA5mbX3hhjjF80JghViMhgzwsRGYQz\nzLkl5gHTRGQHMM19jYhkichzAG7fz73AUhHZhNMf9axb7i4RyQVSgI2ee1zXAItUtcjrXDLO4IoN\nwGrgHVV9r4WfwRhjTAuJav2tTSJyKbAQZ9KqAP2B21R1WetXL/CysrJ0zZo1ga6GMcZ0GCKytrFT\nYRozOm6pOzpuGO7oOCCjZVU0xhhjGjcwAVU9A2z0vBaRvwE2bMwYY0yLNHcV7XpniRpjjDGN0dwg\nZMOWjTHGtFidzXF1bOEAThYU32o1MsbU6XhxGXuOFrHv6GlS46IYndIj0FUypkXq6xNa0Mxrxphm\nKquo5GBhCXuOFrH3aDF7jxazz/26t6CYEyXlNcpPG5nMfTOGkZbcLUA1NqZl6gxCqvphW1bEmK7i\neHFZVYBxspriqtcHCkuoqKxugAgLDiIlLpLUuCjGpsaSGhdFalwUfWMj+eCLPJ5ZsYsZj6/ga5kp\n3D11KP3iogL4yYxpugbnCXV1Nk/INJUnm9nrFVz2ejIbH9lMQkwY/dzgUuOIjyK5WwRBQXWPAzpa\nVMpvl+fwwsd7UFVuOq8/d04ZQkJMeGt/TGPq1JR5QhaEGmBByPjinc14N5vtOVpUbzbjOfrFRdE/\nPop+sVFEhzdqpkS9DhSe5smlO3h1zT4iQoOZPXEQ35k4kG4RoS1+tjFN1WpBSER6qeqhZtesA7Ig\n1DWVV1RyoFY242k221NQdFY2Ex8dVhVYPEHGE3CSu0cQXE82408780/x6KLtvLPpILFRoXz/kiHc\nfH5/IkKD2+T9jYHWDULrVHVss2vWAVkQ6ryOny5zspeCswPN/sLTNbKZ0GChX2x1cOkfX/19v7go\nYvyQzfjTptzjzH9/Kyt3HKF3jwjunjqUr49NISS4ubMyjGm81gxC2aqa2eyadUAWhDqu8opKDh6v\nzmb2FBTXGARw/HTNLbE82Uztfpm2zmb86d85R3j4/W1s2FfIoMRo7ps+jJmjejW0K7ExLeLXteNq\nebYZ9TGm1XiyGV+Bpr5sJqNfz5rNZvHtL5vxhwuGJPCPwfEs2nKYR97fxu1/Xkd6Sg/unzGci4Ym\nBLp6xtjAhIZYJhRYtbOZqqPAdzYT5+mbqTUIIDU+il4dNJvxl4pK5fV1uTy+ZAf7C09z4ZB47p8x\nnDH9ega6aqaTsdFxfmRBqPXVzmZq9M0cO015rWwmpapvJpL+cdFefTORNhqsEc6UV/DnT/by1LIc\njhaVMvOcXtw7I40hSTbh1fiHBSE/siDUcnVlM55AU1jsO5tJdQON8zXashk/O3WmnOdXfsmzK3dR\nXFrO18emcPe0NPr2jAx01UwHZ0HIjywINc6JkjL2FnjmyjQtm6nRbBYXZdlMGys4dYanl+/kTx/v\nAeCWCf25Y/Jg4m3Cq2kmC0J+ZEHI4clmagwCqCebiY0KdTv8o6sCjSfI9O4RadlMO7S/8DRPLNnO\na2tziQoLYfbEgcyeOKhTDtgwrcuCkB91pSDknc3Ubjqrnc2EBAkpsZE15s14Ak2/uCi6WzbTYeXk\nneRXi7bzr82HiIsO485LhnDT+amEh9iEV9M4HSIIiUgc8AowANgNXK+qx3yUSwWeA/rhbC3xFVXd\nLSJ3AncDg4FEVT3ilu8BvISz82sIsEBVF7rXZgE/cR/9S1V9oaF6dqYgVFGpHCg87XMQwJ56spka\nc2fiLZvpKtbvK+SR97eyKqeAvj0juXvqUL42NsX+u5sGdZQgNB84qqrzRGQuEKuqD/gotxx4SFUX\ni0gMUKmqxSKSCRwDlgNZXkHox0APVX1ARBKBbUAvIAZYA2ThBLO1wDhfgc9bRwtCJ0vKagxh9g40\nuQ1kM7WHNFs2YwA+2nGE+e9vZWPucYYmxfBf04cx45xkm/Bq6tSak1X96Spgsvv9CzjBpEYQEpGR\nQIiqLgZQ1VOea6qa7Zap/VwFuolzIQY4CpQDM4DFqnrUvW8xMBN42Y+fqdVVVCoHj5+uzmAKag4C\nOFYrm+npZjOj+vbgK6N71wg0vXtE2DIupkEXDU3gwiEX8t7mQzyyaBvfe2ktY/r15IGZw7hgsE14\nNS0TyCCUrKoHAVT1oIgk+SiTBhSKyOvAQGAJMFdVK+p57lPAW8ABoBvwDVWtFJG+wD6vcrlAXz98\nDr/zZDPVC2ZWB5r9hacpq6iZzfSNdTr+Lxvdu2qSpqdvpkekZTOm5USEy0b3ZtrIZF5ft5/Hlmzn\nxmc/ZeLQBO6fMdx2eDXN1qpBSESW4DSF1fZgIx8RAkwEMoG9OH1ItwLP13PPDGA9MAWnv2ixiKzE\n2Za8Np9tkSIyB5gDkJqa2siqNl7tbMZpMjvN3oKierOZc/r24DI3m+lv2YwJgJDgIK4/tx9XZvTh\npU/28JtlOXz1qY+4fHRvfjg9jcGJMYGuoulgWjUIqerUuq6JyGER6e1mQb2BPB/FcoFsVd3l3vMP\n4HzqD0K3AfPU6ezKEZEvgeHusyZ7lUvBaQL0Ve9ngGfA6ROq573qVDub8QQap2+muN5spnb/jGUz\npr3x7Fn0jXP78ezKL3lu5S7e+/wQ141L4QdTh9K7h014NY0TyOa4t4BZwDz365s+ynwGxIpIoqrm\n42Q3DY0S2AtcCqwUkWRgGLALyAH+V0Ri3XLTgR+1+FP4UFGpjP2fxTUCTY9IJ5sZ2ac7M0f1qhFo\nLJsxHVW3iFB+OC2N/5jQn98sy+HPn+zl9ez9zJrQnzsmDyE2OizQVTTtXCBHx8UDr+IMpd4LXKeq\nR0UkC/ieqs52y00DfoXTnLYWmKOqpSJyF3A/TnNfHvCuqs4WkT7AH4He7j3zVPUl91nfAn7sVuEh\nz9Dt+jR3dNxLn+whLjrMyWZio+gRZdmM8Y+yyjK2Hd1G4ZlCIkMiiQiJIDIkksjgyKrX4cHhARm9\ntu9oMY8v2cEb2blEh4XwnUmD+PZFA/2ye6zpODrEEO2OoqMN0Tadz4nSE2zI20B2Xjbr89ezKX8T\nJRUl9d4jSHVwCokkIjii6nXt897nzroWWl2mdrnQoLr/sNp++CQL3t/Goi2HSYhxJrzecJ5NeO0q\nLAj5kQUh05ZUlf2n9jsBJ2892fnZ5BzLQVGCJZhhccMYmzSWjKQMkqOSOV1+mpLyEudrhfO1xrny\nkhrnq875uKepQoJCiAw+O4BFhERUZWVFZ4TN+0o4WFhB9/BoLh7ah6zUZKLDos4KgDWe4QbNILFm\n6o6oo8wTMqbLK68sZ9vRbWTnZVcFnrzTzhid6NBoxiSOYXr/6WQmZTI6YTRRoVGtUg9V5UzFmRoB\n7HTFaU6XOYGq6px3IKuoDnTF5cU1gtvxM8erypZHlRAdepozWsaiQ7DoUOPrVTuD887Kage+iOAI\nokJrBjfvAFc7I4wMiSQ0KNQm3QaYBSFj2tCp0lNsyN9QFXA2HtlYlYX0ju7NuF7jGJs0lsykTIb0\nHEJwUNs0X4lI1T/araW0vIx/btrDrz/Ywp7CQkb0ieDmCb0ZnBzmBC+voOedsXkCnCdzKykv4UTp\nCQ4XHz4rIFZqZZPqFCzBZ2VfUSFRDQY+7+tRIVH1Nne21X/Djsqa4xpgzXGmJQ6eOsi6vHVVQWdH\n4Q4qtZIgCWJY7DAykjKqmtd6RfuaUtf5lFdU8tpaZ4fXQydKmJSWyP0zhjGqb8smvKoqZZVlvjO2\nMjezq9UcWVXOK9vzvuYdEE+Xn+ZMxZkm1yssKOzsjMwruNXVHFlff5x34AvUIJT6WJ+QH1kQMo1V\nXlnOjmM7WJe3zunPycvmcPFhAKJCokhPTCczKZPMpEzSE9OJDo0OcI0Dq6Ssghc/3s3Ty3dSWFzG\nFem9+a/pwxiY0H5/LpVaWbM/raz+vrgaWZx38PMRED1fy7W8SXXyNQilMYNNfGV93vdHhUaRENm8\nZZksCPmRBSFTl6KyIjbmb2R93nrW5a1jY/5GisuLAUiOSiYzKbMq0xkaO5SQIGv99uVESRnPrtjF\ncyu/pLSikuuz+vGDS4fSq0frNQ22Z55szmfG1oSBJrWDm3dWp74Xi6khLiKOD7/xYbM+gwUhP7Ig\nZDwOFR2qynCy87LZdmwblVqJIKTFppGRlEFmUiZjk8bSO6Z3oKvb4eSfPONMeP10D0Ei3HrhAG6/\neDA9o2zCqz+dNQilwnfQEhGuGHRFs97DgpAfWRDqmioqK8gpzKkKONl52RwsOghAZEgk6QnpVUEn\nPTGdbmHdAlzjzmPf0WIeW7ydN9bvJyY8hO9dPJjbLhxAVJhlkh2FBSE/siDUNRSXFbPpyKaqAQQb\n8jdwqszZOSQxMrGqLyczKZO0uLR6J2oa/9h66AQL3t/Oki8OkxATzl2XDuGb56YSFmJzh9o7C0J+\nZEGoc8orzqueEJqXzdajW6nQCgRhcM/BVSPWMpMy6RvTt92NPupK1u45ysPvbWP1l0fpFxfJf00b\nxpVj+hBkO7y2WxaE/MiCUMdXqZXkFObU6M/Zf2o/4EyGHJUwqirLGZM0hu5h3QNcY1ObqvLh9nzm\nv7eNLQdPMLxXN+6bMYwpw5PsD4R2yIKQH1kQ6nhOl59m85HNVQFnQ/4GTpaeBCA+Ir5G09rw+OHW\ntNaBVFYqb286yKOLtrG7oJis/rHcP3M44wfGBbpqxosFIT+yINT+HTl9pMayN18UfFE112Jwj8HO\nMOnksWQmZpLSLcX+cu4EyioqeXXNPp5YsoO8k2e4ZFgi980Yzsg+lsW2BxaE/MiCUPtSqZV8efzL\nGhNC9510dm0PDw7nnPhznGHSyWMZkziGHuG27XRndrq0ghc+3s3Ty3I4UVLOVRl9+OG0NPrHt98J\nr12BBSE/siAUWCXlJXxe8HmNTOdE6QnAmUyXkegMHshMzmRk3EhCg61prSs6XlzG71fs5A+rvqS8\nQvnm+H7cNWUoSd275oTXQLMg5EcWhNrW0ZKjTsA5nE12fjZbCrZQXuk0rQ3sMdBZhSDRaV5L7ZZq\nTWumhrwTJfz6gxxeXr2XkGDhtgsH8r1Jg21TyTZmQciPLAi1HlXlyxNf1hi1tufEHgBCg0IZlTDK\nGSad6Cx/ExsR28ATjXHsKSjiscXbeXPDAbqFh3D75CHcesEAIsNsReu2YEHIjywI+U9pRelZTWuF\nZwoB6Bnes2peTmZSJiPjRxIeHB7gGpuObsuBEyxYtI0PtuaR1C2cuy4dyjfO7UdosE14bU3tPgiJ\nSBzwCjAA2A1cr6rHfJRLBZ4D+gEKfEVVd4vIncDdwGAgUVWPuOV7AC8BqTh7JS1Q1YXutQpgk/vo\nvap6ZWPqakGo+Y6VHKvaHXR93no2H9lMWWUZAAO6D6gKOhlJGQzsPtCa1kyr+Wz3UR7+11bW7DlG\n//gofjgtja+m24TX1tIRgtB84KiqzhORuUCsqj7go9xy4CFVXSwiMUClqhaLSCZwDFgOZHkFoR8D\nPVT1ARFJBLYBvVS1VEROqWpMU+tqQahxVJW9J/ey7vA61uc7zWtfHv8ScLaB9oxay0jKICMxg/jI\n+ADX2HQ1qsqybXnMf28bWw+dZETv7tw/cxiT0xLtDyA/6wjbe18FTHa/fwEnmNQIQiIyEghR1cUA\nqnrKc01Vs90ytZ+rQDdxLsQAR4Gmbc5hGqWsoowtR7c4Awjyslmfv56jJUcB6B7WncykTK4cfCWZ\nSZmcE39Oq+7YaUxjiAhThiczOS2Jf248wK8Wbee2hZ8xfkAc988cRtYAm/AaCIEKQsmqehBAVQ+K\nSJKPMmlAoYi8DgwElgBzVbWinuc+BbwFHAC6Ad9QrdrvN0JE1uAEpXmq+g8/fZYu4fiZ42zI38C6\nw84uoZ8XfF61y2S/bv24qO9FVf05A3sMJEiszd20T0FBwlUZfblsVG9e+WwvT36Qw7W/+5ipI5K4\nd8YwhveyCa9tqdWCkIgsAXztV/xgIx8RAkwEMoG9OH1ItwLP13PPDGA9MAWnv2ixiKxU1RNAqqoe\nEJFBwAcisklVd9ZR9znAHIDU1NRGVrfzUFVyT+aSnZ/tNK/lrWfncedHFSIhjIgfwfXDrq9a5LO5\nuy8aE0hhIUHcMmEAXx+XwsJVu/ndhzu57ImVXJ3Rl3umppEaHxXoKnYJgeoT2gZMdrOg3sByVR1W\nq8z5OBnLZPf1LcD5qvp9rzK7qdkn9I57z0r39Qc42dPqWs/+I/C2qr7WUF27Qp9QWWUZWwu21tg7\np6CkAIBuod0YkzSmKssZlTCKyJDIANfYGP8rLC7ldx/uYuGqL6lU5cbxqdw5ZSiJ3WyUZlN1hD6h\nt4BZwDz365s+ynwGxIpIoqrm42Q3DUWDvcClwEoRSQaGAbtEJBYoVtUzIpIAXAjM989H6XhOlJ5g\nQ96GqoCz+chmSipKAOgb05cJfSZUBZ3BPQdb05rpEnpGhTH3suHcduEAnly6g5c+3cura3L59kUD\n+c6kQfSItAmvrSFQmVA88CrOUOq9wHWqelREsoDvqepst9w04FeAAGuBOe5It7uA+3Ga+/KAd1V1\ntoj0Af4I9HbvmaeqL4nIBcDvgUogCHhcVetr1qvS0TMhVWX/qf1V83LW5a1jZ+FOFCVYghkeN7xq\n1FpmUiZJUb6654zper48UsSji7fzzw0H6BEZyh2TBzPrggFEhNqE14a0+yHaHUlHC0LlleVsO7qt\nRtNa/ul8AGJCYxiTOKYq4IxOGE1UqLV7G1OfzfuPs2DRNpZvyye5ezg/uDSN67JSbMJrPSwI+VF7\nD0KnSk+xIX9DVaaz8chGTpefBqBPdJ8aqxAM6TmE4CD7K86Y5vh0VwHz39/G2j3HGJgQzQ+npXH5\n6N424dUHC0J+1N6C0MFTB1mXt64q6Gw/th1FCZIghsUOqwo4GUkZ9Ir2NTjRGNNcqsrSL/J45P1t\nbDt8knP6dOf+mcOZNDTBJrx6sSDkR4EMQuWV5ew4tqPG3jmHiw8DEBUSxZjEMVUBJz0xnehQ20PF\nmLZQUam8tWE/v1q0ndxjpzl/UBz3zxzO2FRbZBcsCPlVWwahorIiNuZvrOrL2Zi/keLyYgCSo5Kr\n5uVkJmUyNHYoIUGBGtxojAEoLa/k5dV7+fUHOzhyqpRpI5O5b8Yw0pK7BbpqAWVByI9aMwgdKjpU\nNWJtfd56th3bRqVWIghpsWlVTWuZSZn0jundKnUwxrRc0ZlyFq76kt9/uItTpeVck+lMeO0X1zUH\n/lgQ8iN/BaGKygpyCnPIzsuuCjoHiw4CEBkSSXpCOpnJmWQmZpKemE5MWJPXWjXGBNixolJ+++FO\nXvj3bipVuem8/tw5ZQgJMV1rwqsFIT9qbhAqLitm05FNNZrWTpU5a7AmRSZVj1pLzmRY7DBrWjOm\nEzl4/DRPLt3Bq2tyCQ8JYvZFA5k9aRDdI7rGhFcLQn7UnCBUWlHKBS9fwJmKMwjCkNghVbuDjk0e\nS5/oPjaSxpguYFf+KX61eDvvbDxIbFQod0wewi0T+nf6Ca8WhPyouZnQy1tfJiUmhTFJY+geZqvy\nGtOVbco9zvz3t7JyxxF694jg7qlD+frYFEI66YRXC0J+1N7mCRljOq5/7zzC/Pe2sX5fIYMSo7l3\n+jAuG9Wr07WMNCUIdc4wbIwx7dAFgxN4444L+P0t4wgW4Y4/r+Oq36ziox1HAl21gLEgZIwxbUhE\nmHFOL967exILrhtDwalSbn7+U2589hPW7ysMdPXanDXHNcCa44wxrelMeQV/+XQvT32QQ0FRKTPP\n6cW9M9IYktRxJ7xan5AfWRAyxrSFU2fKeX7llzy7chfFpeV8fWwKd09Lo2/PjreJpAUhP7IgZIxp\nS0eLSnl6WQ4vfrIHFG4+vz/fv2Qw8R1owqsFIT+yIGSMCYT9had5Ysl2XlubS2RoMN+ZNIjZEwcR\nE97+J7ZbEPIjC0LGmEDKyTvJrxZt51+bDxEXHcb3LxnCTeeltusJrxaE/MiCkDGmPdiwr5BH3t/G\nRzlH6Nszkh9MHcrXMvu2ywmvNk/IGGM6mTH9evLS7PP48+zzSIgJ4/7XNjLziZW8t/kQHTmZCEgQ\nEpE4EVksIjvcrz53ghKRVBFZJCJfiMgWERngnr9TRHJEREUkwat8rIi8ISIbRWS1iIzyujZTRLa5\n981t7c9ojDGt4cIhCfzj+xfyu5vHoqp876W1XP30v/l3Tsec8BqoTGgusFRVhwJL3de+vAg8oqoj\ngPFAnnt+FTAV2FOr/I+B9aqaDvwH8ASAiAQDvwEuA0YCN4jISP99HGOMaTsiwsxRvXn/7knMvzad\n/BMl3Pjcp9zy/KdszO1YE14DFYSuAl5wv38BuLp2ATdIhKjqYgBVPaWqxe732aq628dzR+IENVR1\nKzBARJJxAliOqu5S1VLgr24djDGmwwoJDuL6rH58cO9kfnL5CD4/cIIrn1rFHX9ey878U4GuXqME\nKgglq+pBAPdrko8yaUChiLwuItki8oib0dRnA/A1ABEZD/QHUoC+wD6vcrnuOWOM6fAiQoOZPXEQ\nH943mR9cOpQPt+Uz/bEVzP37Rg4ePx3o6tWr1Qaci8gSoJePSw828hEhwEQgE9gLvALcCjxfzz3z\ngCdEZD2wCcgGygFfS9TW2ZMnInOAOQCpqamNrK4xxgRWt4hQ7pmWxn9M6M9vlu3kpU/28Hr2fmZN\n6M/tk4cQFx0W6CqepdWCkKpOreuaiBwWkd6qelBEelPd1+MtF8hW1V3uPf8AzqeeIKSqJ4Db3PIC\nfOkeUUA/r6IpwIF6nvMM8Aw4Q7TrKmeMMe1RfEw4P/3qSL510QAeX7KD5z/6kpdX72POpEF8+6KB\nRLejCa+Bao57C5jlfj8LeNNHmc+AWBFJdF9PAbbU91AR6SkinlA/G1jhBqbPgKEiMtC9/k23DsYY\n02mlxEax4LoxvH/3JC4cEs+ji7czaf4yFq76kjPlFYGuHhC4IDQPmCYiO4Bp7mtEJEtEngNQ1Qrg\nXmCpiGzCaVJ71i13l4jk4mQ0Gz33ACOAz0VkK85IuB+4zyoH7gTeB74AXlXVz9vkkxpjTIANTe7G\n72/J4o07LiAtuRu/+OcWpiz4kL+vzaWiMrCNPbZiQgNsxQRjTGeiqnyU4+zwumn/cdKSY7h3+jCm\njUz22w6vtmKCMcYYn0SEiUMTeevOC3n6prGUVyhz/rSWr/3233y8s6DN62NByBhjuiAR4Suje7Po\nnknM+9poDhaWcMOzn/Aff1jN5v3H26weFoSMMaYLCwkO4pvjU1l+32Qe/MoINuYWcsWvP+L7f1nH\n6dLWH7zQfsbpGWOMCZgId8+ib4zvx7MrdrHlwAkiQls/T7EgZIwxpkr3iFD+a/owVNVvAxXqY81x\nxhhjztIWAQgsCBljjAkgC0LGGGMCxoKQMcaYgLEgZIwxJmAsCBljjAkYC0LGGGMCxoKQMcaYgLFV\ntBsgIvnAnmbengAc8WN1/MXq1TRWr6axejVNZ6xXf1VNbLiYBaFWJSJrGruceVuyejWN1atprF5N\n09XrZc1xxhhjAsaCkDHGmICxINS6ngl0Bepg9Woaq1fTWL2apkvXy/qEjDHGBIxlQsYYYwLGglAz\niUiwiGSLyNs+roWLyCsikiMin4rIAK9rP3LPbxORGW1crx+KyBYR2SgiS0Wkv9e1ChFZ7x5vtXG9\nbhWRfK/3n+11bZaI7HCPWW1cr8e86rRdRAq9rrX2z2u3iGxyn7/Gx3URkSfd36WNIjLW61qr/cwa\nUa+b3PpsFJF/i8iYxt7byvWaLCLHvf6b/dTr2kz3/8ccEZnbxvW6z6tOm93fq7jG3NvCevUUkddE\nZKuIfCEiE2pdb7vfL1W1oxkH8EPgL8DbPq7dAfzO/f6bwCvu9yOBDUA4MBDYCQS3Yb0uAaLc72/3\n1Mt9fSqAP69bgad8nI8DdrlfY93vY9uqXrXK/Sfwhzb8ee0GEuq5/hXgX4AA5wOftsXPrBH1usDz\nfsBlnno15t5WrtfkOn73gt3/DwcBYe7/nyPbql61yn4V+KCNfl4vALPd78OAnoH6/bJMqBlEJAW4\nHHiujiJX4fxHBngNuBPjla4AAAaUSURBVFRExD3/V1U9o6pfAjnA+Laql6ouU9Vi9+UnQIq/3rsl\n9arHDGCxqh5V1WPAYmBmgOp1A/Cyv97bD64CXlTHJ0BPEelNK//MGqKq/3bfF9rwd6wFxgM5qrpL\nVUuBv+L8bAOhTX7HRKQ7MAl4HkBVS1W1sFaxNvv9siDUPI8D9wOVdVzvC+wDUNVy4DgQ733eleue\na6t6efs2zl86HhEiskZEPhGRq/1Yp8bW6+tu2v+aiPRzz7WLn5fbbDkQ+MDrdGv+vAAUWCQia0Vk\njo/rdf1sWvtn1lC9vNX+HWvKva1RrwkiskFE/iUi57jn2sXPS0SicP4x/3tT722GQUA+sNBtin5O\nRKJrlWmz36+QltzcFYnIFUCeqq4Vkcl1FfNxTus531b18pS9GcgCLvY6/f/bu7cQq6o4juPfH2lh\nKuKli1JioahIogY9ZAhZRBeYMIREexifKsyC6KG7pVCSRPliDoUlaReTDCMpxS7mSF4fFEXKNMR8\nkPShxkTQ+few1sEzJy8z09lnD/n7wDBr9l5rn/+ss8+s2Wst1hoeEUcl3Qx8K2lPRPzaoLi+BD6O\niNOSHiM9RU6lh9QXqUt1dUScrTpWSH1VmZyvfy2wQdL+iNhU/Sucp0yh91gn40rBSXeSGqE7ulq2\noLh2kZaSaZN0P/AFMIoeUl+krrjWiDjRjbJd1QuYBMyNiK2SFgPPAi9V5WnY/eUnoa6bDDRJ+o30\n6D5V0oqaPEeAGwEk9QIGACeqj2c3AEcbGBeS7gZeAJoi4nTleEQczd8PAt8DExsVV0Qcr4rlXeDW\nnC69vrIZ1HSTFFhftdc/Bqzh3922F6qbIuusM3EhaTypi/PBiDjelbJFxRURf0ZEW06vA3pLGkIP\nqK/sYvdYvevrCHAkIrbmn1eTGqXaPI25v4oY9LpcvrjwYOccOk5MWJXT4+g4MeEgdZ6YcIm4JpIG\nYUfVHB8IXJXTQ4BfqOPgbCfiGlqVngb8lNODgEM5voE5PahRceVzo0kDxGpUfQF9gf5V6S3AvTV5\nHqDjwPG2ouusk3ENJ4113t7VsgXHdX3lPST9MT+c665X/hzexLmJCeMaFVc+V/kntW8j6itf80dg\ndE6/Aiwq6/5yd1ydSJoP7IiItaQBvw8lHSDdXDMAImKvpFXAPuAMMCc6dvEUHdcioB/wWZonweGI\naALGAi2S2klPxwsjYl8D43pSUhOpTk6QZssRESckLQC252Lzo2N3RdFxQRos/iTyJzArur6uA9bk\n96gX8FFEfJ27KomIpcA60gymA8DfwOx8rsg660xcL5PGP5fkfGciLYJ53rINjGs68LikM8ApYEZ+\nT89IegL4hjRTbllE7G1gXJD+8VofEScvVbZOcUGa7blS0pWkRnh2WfeXV0wwM7PSeEzIzMxK40bI\nzMxK40bIzMxK40bIzMxK40bIzMxK40bIzMxK40bI7H9Aadn/Id0s2yxpWD2uZdZVboTMrBkYdqlM\nZkVwI2RWR5JGKG0U9p7SJmUrJd0tqTVvAnZb/tqSVzDeIml0Lvu0pGU5fUsuf/UFXmewpPX5Gi1U\nLSwp6RFJ25Q2Q2uRdEU+3ibpTUm7lDY1vEbSdNJititz/j75MnNzvj2SxhRZZ3Z5cyNkVn8jgcXA\neGAMMJO0mvQzwPPAfmBKREwkLXPzWi73NjBS0jTgfeDROLf/U615wOZ8jbWkNduQNBZ4mLQC8wTg\nLDArl+kL7IqIScAPwLyIWA3sAGZFxISIOJXz/pHzvZPjNiuE144zq79DEbEHQNJeYGNEhKQ9wAjS\ngpXLJY0iLYPfGyAi2iU1A7uBlohovchrTAEeyuW+klTZSO4u0irk2/O6Y32AY/lcO/BpTq8APr/I\n9SvndlZex6wIboTM6u90Vbq96ud20mduAfBdREyTNIK0FUTFKKCNzo3RnG/hRwHLI+K5bpavqMR8\nFv+dsAK5O86s8QYAv+d0c+WgpAGkbrwpwOA8XnMhm8jdbJLuIy2rD7ARmJ43QkPSIKWdYSF93ivX\nnAlszum/gP7/4fcx6zY3QmaN9wbwuqRW0vYBFW8BSyLiZ9KupAsrjcl5vApMkbQLuIe0Pw55S4kX\nSdtC7wY2AENzmZPAOEk7STvXzs/HPwCW1kxMMGsIb+VgdpmQ1BYR/cqOw6yan4TMzKw0fhIy68Ek\nzQaeqjncGhFzyojHrN7cCJmZWWncHWdmZqVxI2RmZqVxI2RmZqVxI2RmZqVxI2RmZqX5BxCFmHL8\ndqhfAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a14f34550>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# summarize results\n",
    "print(\"Best: %f using %s\" % (gsearch2_2.best_score_, gsearch2_2.best_params_))\n",
    "test_means = gsearch2_2.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = gsearch2_2.cv_results_[ 'std_test_score' ]\n",
    "train_means = gsearch2_2.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = gsearch2_2.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "pd.DataFrame(gsearch2_2.cv_results_).to_csv('my_preds_maxdepth_min_child_weights_2.csv')\n",
    "\n",
    "# plot results\n",
    "test_scores = np.array(test_means).reshape(len(min_child_weight), len(max_depth))\n",
    "train_scores = np.array(train_means).reshape(len(min_child_weight), len(max_depth))\n",
    "\n",
    "for i, value in enumerate(min_child_weight):\n",
    "    pyplot.plot(max_depth, test_scores[i], label= 'test_min_child_weight:'   + str(value))\n",
    "#for i, value in enumerate(min_child_weight):\n",
    "#    pyplot.plot(max_depth, train_scores[i], label= 'train_min_child_weight:'   + str(value))\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'max_depth' )                                                                                                      \n",
    "pyplot.ylabel( '- Log Loss' )\n",
    "pyplot.savefig( 'max_depth_vs_min_child_weght2.png' )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "根据二次的调试，最佳参数组合：{'max_depth': 5, 'min_child_weight': 4}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
